#include <iostream>
#include <atomic>
#include <random>
#include <sstream>
#include <iomanip>

std::string uuid()
{
    std::random_device rand;
    std::mt19937_64 gernator(rand());        // 通过梅森旋转算法，生成伪随机数
    std::uniform_int_distribution<int> distribution(0, 255);    // 限定随机范围

    // 约定：8组随机数，每组1字节的16进制
    std::stringstream ss;
    for(int i = 0; i < 8; ++i)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator);
        if(i == 3 || i == 5 || i == 7) ss << '-';
    }

    // 加入自增id, 取出8字节序号
    static std::atomic_size_t seq(1);
    size_t num = seq.fetch_add(1);
    for(int i = 7; i >= 0; --i)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> (i * 8)) & 0xFF);
        if(i == 5) ss << '-';
    }
    return ss.str();
}

int main()
{
    for(int i = 0; i < 20; ++i)
        std::cout << uuid() << '\n';

    // std::random_device rand;
    // // size_t num = rand();      // 生成机器随机数，效率较低

    // std::mt19937_64 gernator(rand());   // 通过梅森旋转算法，生成伪随机数
    // std::uniform_int_distribution<int> distribution(0, 255);    // 限定随机范围

    // // 转16进制
    // std::stringstream ss;
    // ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator);

    // std::cout << ss.str() << '\n';


    return 0;
}